package geditor.common {
import common.properties.validation.HasValidation;
import common.properties.validation.ValidationInfo;

import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.filters.ColorMatrixFilter;

import geditor.DrawTool;
import geditor.events.ChangeEvent;

import mx.core.UIComponent;

/**
 * Абстрактный DrawComponent. Предоставляет общую функциональность:<br/>
 *  - Информация для валидации<br/>
 *  - применяет фильтр при ошибках валидации<br/>
 *  - ссылка на DrawTool      <br/>
 */
public class AbstractDrawComponent extends EventDispatcher implements HasValidation {
    public function AbstractDrawComponent() {
        _validationInfo = new ValidationInfo();
        _validationInfo.addEventListener("change", _validationChange);
    }

    public function get scalableDisplay():UIComponent {
        return null;
    }

    public function get notScalableDisplay():UIComponent {
        return null;
    }

    private function _validationChange(evt:Event):void {
        if (_validationInfo.valid) {
            clearRed(scalableDisplay);
            clearRed(notScalableDisplay);
        } else {
            applyRed(scalableDisplay);
            applyRed(notScalableDisplay);
        }
    }

    private function clearRed(c:UIComponent):void {
        if (c == null) return;

        c.filters = null;
    }

    private function applyRed(c:UIComponent):void {
        if (c == null) return;

        var matrix:Array = new Array();
        matrix = matrix.concat([1, 0, 0, 0, 0]); // red
        matrix = matrix.concat([0, 0, 0, 0, 0]); // green
        matrix = matrix.concat([0, 0, 0, 0, 0]); // blue
        matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha

        applyFilter(c, matrix);
    }

    private function applyFilter(child:DisplayObject, matrix:Array):void {
        var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
        var filters:Array = new Array();
        filters.push(filter);
        child.filters = filters;
    }

    protected var _tool:DrawTool;

    public function get tool():DrawTool {
        return _tool;
    }

    public function set tool(value:DrawTool):void {
        _tool = value;
    }

    public function refresh():void {

    }

    /**
     * Listener, который обновляет внешний вид объекта и оповещает другие компоненты об изменении
     * @param evt
     */
    protected function _refreshListener(evt:Event):void {
        fireChange();
        refresh();
    }

    public function fireChange():void {
        dispatchEvent(new ChangeEvent());
    }

    private var _validationInfo:ValidationInfo;

    public function get validationInfo():ValidationInfo {
        return _validationInfo;
    }
}
}